import {
  Controller,
  Get, Post, 
  Body,
  UploadedFile,
  UseInterceptors,
  ParseFilePipe,
  MaxFileSizeValidator, // 文件最大 size 的管道
  FileTypeValidator,
  UploadedFiles, // 验证上传文件大小的管道
} from "@nestjs/common";

// 获取拦截器
import {
  FileFieldsInterceptor, // 多个字段 多个文件上传
  FileInterceptor, // 一个字段 上传一个文件
  FilesInterceptor, // 一个字段 上传多个文件
  AnyFilesInterceptor, // 任意字段名的多文件上传
  NoFilesInterceptor, // 不允许上传文件
} from '@nestjs/platform-express'

// 获取管道
import { FileSizeValidationPipe } from './file-size-validation.pipe'


@Controller('upload')
export class UploadController {
  // 上传单个文件并使用管道判断文件大小
  @Post('file')
  @UseInterceptors(FileInterceptor('file')) // 处理上传字段名为 file 的文件
  fileHandle(@UploadedFile(FileSizeValidationPipe) file: Express.Multer.File) {
    console.log('file ', file)
    return 'upload'
  }

  // 上传单个文件并使用管道判断文件大小
  @Post('file2')
  @UseInterceptors(FileInterceptor('file')) // 处理上传字段名为 file 的文件
  fileHandle2(
    @UploadedFile(new ParseFilePipe({
      validators: [
        new MaxFileSizeValidator({ maxSize: 1024 * 300 }), // 文件最大 300kb
        new FileTypeValidator({
          fileType: 'image/png', // 允许上传的文件类型
        })
      ]
    })) file: Express.Multer.File
  ) {
    console.log('file ', file)
    return 'upload2'
  }

  // 一个字段多个文件上传
  @Post('file3')
  @UseInterceptors(FilesInterceptor('files', 10)) // 上传字段名是 files 同时最多只允许上传10个文件
  fileHandle3(
    @UploadedFiles() files: Express.Multer.File[]
  ) {
    console.log('files ', files) // 多个文件上传
    return 'upload3'
  }

  // [
  //   {
  //     fieldname: 'files',
  //     originalname: '1696299741180.png',
  //     encoding: '7bit',
  //     mimetype: 'image/png',
  //     buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 04 73 00 00 01 f6 08 06 00 00 00 f3 90 c0 bb 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00 00 04 ... 40914 more bytes>,
  //     size: 40964
  //   },
  //   {
  //     fieldname: 'files',
  //     originalname: 'logo.jpg',
  //     encoding: '7bit',
  //     mimetype: 'image/jpeg',
  //     buffer: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ff ec 00 ba 37 39 41 45 41 4c 46 32 4c 48 43 4e 00 00 00 00 10 00 00 00 a0 55 87 be f0 c9 ... 20532 more bytes>,
  //     size: 20582
  //   }
  // ]

  // 多个字段 多个文件上传
  @Post('file4')
  @UseInterceptors(FileFieldsInterceptor([
    { name: 'avatar', maxCount: 1 }, // avatar 字段最多可以上传一个文件
    { name: 'background', maxCount: 1 }, // background 字段最多可以上传一个文件
  ]))
  fileHandle4(@UploadedFiles() files: { avatar?: Express.Multer.File[], background?: Express.Multer.File[] }) {
    console.log('files ', files)
    return 'upload4'
  }
  // files  [Object: null prototype] {
  //   avatar: [
  //     {
  //       fieldname: 'avatar',
  //       originalname: '1715238358400.png',
  //       encoding: '7bit',
  //       mimetype: 'image/png',
  //       buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 06 db 00 00 04 2d 08 06 00 00 00 3b b2 f0 14 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00 00 04 ... 69069 more bytes>,
  //       size: 69119
  //     }
  //   ],
  //   background: [
  //     {
  //       fieldname: 'background',
  //       originalname: 'logo.jpg',
  //       encoding: '7bit',
  //       mimetype: 'image/jpeg',
  //       buffer: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ff ec 00 ba 37 39 41 45 41 4c 46 32 4c 48 43 4e 00 00 00 00 10 00 00 00 a0 55 87 be f0 c9 ... 20532 more bytes>,
  //       size: 20582
  //     }
  //   ]
  // }

  // 任意字段 多文件上传
  @Post('file5')
  @UseInterceptors(AnyFilesInterceptor())
  fileHandle5(@UploadedFiles() files: Express.Multer.File[]) {
    console.log('files ', files)
    return 'upload5'
  }

  // files  [
  //   {
  //     fieldname: 'avatar',
  //     originalname: '1715238358400.png',
  //     encoding: '7bit',
  //     mimetype: 'image/png',
  //     buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 06 db 00 00 04 2d 08 06 00 00 00 3b b2 f0 14 00 00 00 01 73 52 47 42 00 ae ce 1c e9 00 00 00 04 ... 69069 more bytes>,
  //     size: 69119
  //   },
  //   {
  //     fieldname: 'background',
  //     originalname: 'logo.jpg',
  //     encoding: '7bit',
  //     mimetype: 'image/jpeg',
  //     buffer: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 01 00 01 00 00 ff ec 00 ba 37 39 41 45 41 4c 46 32 4c 48 43 4e 00 00 00 00 10 00 00 00 a0 55 87 be f0 c9 ... 20532 more bytes>,
  //     size: 20582
  //   },
  //   {
  //     fieldname: 'tags',
  //     originalname: '@)9BM_TL7MQ5]JV9D%4MT@I.png',
  //     encoding: '7bit',
  //     mimetype: 'image/png',
  //     buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 07 6f 00 00 04 12 08 02 00 00 00 07 6f 26 b8 00 00 20 00 49 44 41 54 78 01 ec dd 09 9c 14 c5 dd ... 138185 more bytes>,
  //     size: 138235
  //   }
  // ]

  // 不允许上传文件
  @Post('file6')
  @UseInterceptors(NoFilesInterceptor())
  fileHandle6(@Body() body) {
    console.log('body ', body)
    return 'upload6'
  }
}
